﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UniCT.LinkShareWpf.Interface;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;

namespace UniCT.LinkShareWpf.CommunicationChannel
{
    public class Channel : IDisposable
    {
        #region Private
        private IContract channel = null;
        private ChannelFactory<IContract> factory = null;
        #endregion

        public IContract Client
        {
            get { return channel; }
        }

        public Channel(Uri address)
        {
            // Il servizio risponde su HTTP e supporta la comunicazione minima basata su SOAP
            BasicHttpBinding bindingType = new BasicHttpBinding();
            bindingType.OpenTimeout = new TimeSpan(0, 0, 5);
            bindingType.CloseTimeout = new TimeSpan(0, 0, 5);
            bindingType.ReceiveTimeout = new TimeSpan(0, 0, 5);
            bindingType.SendTimeout = new TimeSpan(0, 0, 5);
            
            // Fornisce un indirizzo di rete univoco che un client utilizza per comunicare con un endopoint del servizio
            EndpointAddress epAddress = new EndpointAddress(address);
            
            // Crea il canale utilizzato dal client per inviare messaggi all'endpoint del servizi
            // specificando un determinato tipo di binding e un address remoto
            

            
            factory = new ChannelFactory<IContract>(bindingType, epAddress);
            // Crea un canale utilizzato per mandare messaggi al servizio 
            // ritornando un riferimento al server 
            channel = factory.CreateChannel();
        }

        public void Dispose()
        {
            try
            {   
                // Fa transitare l'oggetto dallo stato attuale allo stato di Close. ChannelFactory eredita da ICommunicationObject
                factory.Close();
                Console.WriteLine();
            }
            catch (Exception e)
            {
                Console.WriteLine("Channels.cs" + e.Message);
            }
        }

    }

}